package optymalizacjaSkladowania;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import skladowisko.DostepDoPola;
import skladowisko.Kontener;
import skladowisko.Pole;
import skladowisko.Skladowisko;
import skladowisko.Warstwa;
import skladowisko.transport.Transport;

/**
 *
 * @author Krzysiek
 */
public class StrategiaK2Standard implements StrategiaK2
{

    public double k2(Pole p, Kontener k)
    {
        if (p.getZawartoscPola().isPelne())
        {
            return -1;
        }

        int kolumna = p.getX();

        Skladowisko skl = p.getSkladowisko();
        List<Kontener> konteneryKolumna = new ArrayList<Kontener>();

        for (int i = 0; i < skl.getRzedy(); i++)
        {
            Pole tmp = skl.getPole(kolumna, i+1);
            int wolna = tmp.getZawartoscPola().getPierwszaWolna();

            Kontener kon;
            for(int j=1;j<wolna;j++)
            {
                kon = tmp.getZawartoscPola().getObiektAt(j);
                if(kon.getTransportPrzeznaczenie() != null)
                    if(kon.getTransportPrzeznaczenie().getPlanowanaData() != null)
                        konteneryKolumna.add(kon);
            }
        }

        DostepDoPola dostep = p.getSkladowisko().sprawdzDostep(p);
        int wynik = dostep.ileOperacjiDoWykonania();

        p.getZawartoscPola().polozObiekt(k);
        wynik += 1;
        wynik += obliczOperacjeKolumny(konteneryKolumna);
        return wynik;
    }


    private double obliczOperacjeKolumny(List<Kontener> kontenery)
    {
        Collections.sort(kontenery, new KomparatorCzasow());
        double wynik = 0;

        Transport aktualny = null;

        for(Kontener k : kontenery)
        {
            Pole p = ((Warstwa)k.getMiejsce()).getPole();
            if(k.getTransportPrzeznaczenie() != aktualny)
            {
                aktualny = k.getTransportPrzeznaczenie();
                DostepDoPola dostep = p.getSkladowisko().sprawdzDostep(p);
                wynik+=dostep.getIleOperacji();
            }

            wynik += p.getZawartoscPola().sciagnijObiekt(k);
        }


        return 0;
    }


    private double k3(Warstwa warstwa, Kontener k)
    {
        return 0;
    }


    private class KomparatorCzasow implements Comparator<Kontener>
    {
        public int compare(Kontener t1, Kontener t2)
        {
            Date o1 = t1.getTransportPrzeznaczenie().getPlanowanaData();
            Date o2 = t2.getTransportPrzeznaczenie().getPlanowanaData();

            if(o1.before(o2))
                return 1;
            return -1;
        }
    }
}
